// MicTest.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "MicTest.h"
#include "MicTestDlg.h"

#include "../Vocoder/Vocoder.h"
#include "../Vocoder/CarrierImpl.h"
#include "../Vocoder/SoundBank.h"
#include "../Vocoder/PitchTracker.h"
#include "StreamingRecorder.h"
#include "ModulatorThread.h"
#include "SoundPlayer.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMicTestApp

BEGIN_MESSAGE_MAP(CMicTestApp, CWinApp)
	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// CMicTestApp construction

CMicTestApp::CMicTestApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}


// The one and only CMicTestApp object

CMicTestApp theApp;


// CMicTestApp initialization

BOOL CMicTestApp::InitInstance()
{
	// InitCommonControlsEx() is required on Windows XP if an application
	// manifest specifies use of ComCtl32.dll version 6 or later to enable
	// visual styles.  Otherwise, any window creation will fail.
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// Set this to include all the common control classes you want to use
	// in your application.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();

	// Standard initialization
	// If you are not using these features and wish to reduce the size
	// of your final executable, you should remove from the following
	// the specific initialization routines you do not need
	// Change the registry key under which our settings are stored
	// TODO: You should modify this string to be something appropriate
	// such as the name of your company or organization
	SetRegistryKey(_T("Local AppWizard-Generated Applications"));



	int SAMPLE_RATE = 48000;
	int WINDOW_LENGTH = 2048;

	SoundPlayer player;
	player.Initialize(1, SAMPLE_RATE);
	player.Play();

	PitchTracker pitchTracker(WINDOW_LENGTH, SAMPLE_RATE);
	SoundBank soundBank(SAMPLE_RATE);
	CarrierImpl carrier;
	carrier.SetFrequencyProvider(&pitchTracker);
	carrier.soundBank = &soundBank;

	Vocoder vocoder;
	vocoder.Initialize(&player, &carrier, 0);

	ModulatorThread modulator(WINDOW_LENGTH);
	modulator.vocoder = &vocoder;
	modulator.Start();

	StreamingRecorder recorder;
	recorder.modulator = &modulator;
	recorder.Start(SAMPLE_RATE);

	

	CMicTestDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	recorder.Stop();
	modulator.Stop();
	/*
	while(player.HasMoreSamples())
	{
		Sleep(300);
	}
	*/
	player.Stop();

	if (nResponse == IDOK)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with OK
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: Place code here to handle when the dialog is
		//  dismissed with Cancel
	}

	// Since the dialog has been closed, return FALSE so that we exit the
	//  application, rather than start the application's message pump.
	return FALSE;
}
